#ifndef SHMD_H
#define SHMD_H

#define  BUFFER_SIZE    30   // 缓冲区大小
#define  SHM_KEY        888  // 约定共享内存的 key  

#define  MUTEX_KEY      333  // 约定mutex信号量的key
#define  FULL_KEY       666  // 约定full信号量的key
#define  EMPTY_KEY      999  // 约定empty信号量的key

/*
 * 定义共享内存数据结构
 */ 
typedef struct shmd
{
    int buffer[BUFFER_SIZE];  // 数据缓冲区
    int p, c;                 // 生产者，消费者每次访问缓冲区的下标
    int num;                  // 记录生产的产品总数
    int p_speed;              // 生产速度，0 表示停止生产
    int c_speed;              // 消费速度，0 表示停止消费
}shmd_t;

/*
 * 将共享内存相关系统调用封装成接口
 * 方便生产者和消费者调用
 */
int   get_shm(const int key);                           // 向系统申请共享内存
void* attach_shm(const int shmid);                      // 绑定共享内存到进程地址空间
void  init_shm(void* shm_ptr, const int num);           // 初始化共享内存中的数据
void  free_shm(const void* shm_ptr, const int shmid);   // 释放共享内存空间

/*
 * 打印共享内存数据
 */
void show_shm( int (*output)(const char * fm, ...),  // 输出函数指针，遵循C语言标准输出格式
               void* shm_ptr );  

/*
 * 将信号量相关系统调用封装成接口
 * 方便生产者和消费者调用
 */
int  get_sem(const int key);                    // 向系统申请信号
void init_sem(const int semid, const int val);  // 初始化信号量
void sem_pv(const int semid, const int op);     // 信号量pv操作
void free_sem(const int semid);                 // 释放系统的信号量

#endif